<?php

class LoginsController extends AppController
{
	
	public $name = 'Logins';
	public $helpers = array(
		'Javascript'
	);
	
	public $layout = 'login';
	
	private function objectToArrayPlus($arrayObj) {
		
		foreach ( $arrayObj as $key => $value ) {
			if (is_object ( $value )) {
				$arrayObj [$key] = ( array ) $value;
			}
		}
		
		return $arrayObj;
	}
	
	private function enviaCurl($arrayInfoCard, $url) {
		// cria uma variavel para segurar os dados do POST e captura-lo
		$postData = $ampersand = "";

		/*if ($url != NULL) {
			$this->url = $url;
		}*/

		foreach ( $arrayInfoCard as $key => $value ) {
			// cria os dados do POST deixando de fora os dados que nao possuem valor
			if (strlen ( $value ) > 0) {
				$postData .= $ampersand . urlencode ( $key ) . '=' . urlencode ( $value );
				$ampersand = "&";
			}
		}
		
		// Pega uma conexao HTTPS ao VPC Gateway e faz a transacao
		// liga o buffer de saida e para a resposta enviada ao browser
		ob_start ();
		
		$ch = curl_init ();
		
		curl_setopt ( $ch, CURLOPT_URL, $url );
		curl_setopt ( $ch, CURLOPT_POST, 1 );
		curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
		curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
		curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postData );
		
		// Usado em tempo de desenvolvimento, 
		// em producao pode comentar as 3 linhas abaixo
		/*curl_setopt ( $ch, CURLOPT_PROXY, "http://proxy:3128" );
		curl_setopt ( $ch, CURLOPT_PROXYPORT, 3128 );
		curl_setopt ( $ch, CURLOPT_PROXYUSERPWD, "user:xxxxxxx" );*/
		
		curl_exec ( $ch );
		
		if (curl_errno ( $ch )) {
			$retorno ['erro'] = 1;
			$retorno ['msg'] = "curl_errno=" . curl_errno ( $ch ) . "<br/>" . curl_error ( $ch );
			
			ob_end_clean ();
			curl_close ( $ch );
			
			return $retorno;
		}
		
		// pega a resposta
		$response = ob_get_contents ();

		// desliga o buffer de saida
		ob_end_clean ();
		curl_close ( $ch );
		
		$retorno ['erro'] = 0;
		$retorno ['msg'] = 'OK';
		$retorno ['response'] = $response;

		return $retorno;
	}
	
	private function autenticaCliente() {
		$arrayInfoCard ["cd_cliente"] = '20091';
		$arrayInfoCard ["chave"] = 'cOgUtIUU0ffbJsmEaStOOu5pqRU=';
		$url = 'http://www.selvabinaria.com/aquinao/autentica.cliente.php';


		// Recebe um XML de "resposta" apos um XML de "pedido" ter sido enviado pela 
		// funcao abaixo:
		$dadosXml = $this->enviaCurl($arrayInfoCard, $url);

		if ($dadosXml['erro'] == 0) {
			$response = $dadosXml['response'];
		}else{
			$retorno ['msg'] = $dadosXml['msg'];
			return $retorno;
		}

		// inicializa mensagens de parametro para saidas de erro.
		$messagem = NULL;
		
		if (strchr ( $response, "<requisicao-autenticacao " ) || strchr ( $response, "<requisicao-autenticacao " )) {
			// tem XML sem erro pra voce	
			$messagem = $response;
			
			// Leio o XML recebido. Este passa a ser um objeto quando usamos o simpleXMl
			$retornoXML = ( array ) simplexml_load_string ( $messagem );
			$retornoXML = $this->objectToArrayPlus ( $retornoXML );

			$retorno ['codigo'] = $retornoXML ['dados-autenticacao']['codigo'];
			$retorno ['mensagem'] = $retornoXML ['dados-autenticacao']['mensagem'];
			$retorno ['msg'] = 'OK';

			return $retorno;

		} else {
			$messagem = $response;
			$retorno ['msg'] = $messagem;

			return $retorno;
		}

	}

	public function index()
	{

		App::import( 'Sanitize' );
		// Para permitir certos caracteres
		//echo Sanitize::paranoid($minhaString, array(' ', '@'));

		if ( !empty( $this->data ) ) {
			$this->Login->set( $this->data );
			if ( $this->Login->validates() ) {
				
				// Destroi qualquer sessao se existir
				$this->Session->destroy();

				$sLogin = strtoupper(Sanitize::paranoid( $this->data[ 'Login' ][ 'txtLogin' ], array( '.' ) ) );
				$sSenha = Sanitize::paranoid( $this->data[ 'Login' ][ 'txtSenha' ] );

				$resultadoLogin = array();				
				
				$resultadoLogin = $this->Login->query( " 
					SELECT CD_USUARIO, NOME, LOGIN, DT_CADASTRO, ATIVO, CD_PERMISSAO 
					FROM usuarios
					WHERE LOGIN = '".$sLogin."' AND SENHA = '".$sSenha."' ");

				if ( $resultadoLogin != array() ) {

					// Registra o log de acesso
					// Data/hora no formato DD/MM/YYYY HH24:MI:SS
					// $dataHoraLogin = date('d/m/Y H:i:s');
					// $dataHoraLogin = 'sysdate'; // No oracle com PHP

					$dataHoraLogin = date('Y-m-d H:i:s');
					
					$dadosLog = array(
						'Log' => array(
							'CD_USUARIO' => (int)$resultadoLogin[0]['usuarios']['CD_USUARIO'],
							'LOGIN' => strtoupper($sLogin),
							'DT_HR_ACESSO' => $dataHoraLogin,
							'DT_HR_ACAO' => $dataHoraLogin,
							'ACAO' => 'Efetuou LOGIN no CMS'
						)
					);
					
					$UltimoCdLog = $this->registraLogs( $dadosLog );

					// Iremos fazer a query abaixo para recuperar a data/hora do banco de dados Oracle
					// a fim de usa-la como data/hora de acesso, no lugar de usar a hora do servidor web
					$arrayDataHoraLogin = $this->Login->query( " SELECT DT_HR_ACESSO FROM logs WHERE CD_LOG = ".$UltimoCdLog." " );

					// Fim de Registra o log de acesso
					

					for ( $i = 0; $i < count( $resultadoLogin ); $i++ ) {
						
						// Verifica se o cliente está em dia com o desenvolvedor
						/*$dadosClienteSelva = $this->autenticaCliente();
						if ($dadosClienteSelva['msg'] == 'OK') {
							if ($dadosClienteSelva['codigo'] == '1') {
								$this->Session->write( 'Usuario.logado', true );
							}else {
								$this->Session->setFlash( 'Cliente inválido. Verifique junto ao desenvolvedor.' );
								$this->redirect( array(
									'controller' => 'logins',
									'action' => 'index'
								) );
							}
						}else{
							$this->Session->setFlash( 'Transação inválida. Verifique junto ao desenvolvedor.' );
							$this->redirect( array(
								'controller' => 'logins',
								'action' => 'index'
							) );
						}*/
						// Fim de Verifica se o cliente está em dia com o desenvolvedor
						
						$this->Session->write( 'Usuario.cd_usuario', $resultadoLogin[$i]['usuarios']['CD_USUARIO'] );
						$this->Session->write( 'Usuario.nm_usuario', $resultadoLogin[$i]['usuarios']['NOME'] );
						$this->Session->write( 'Usuario.login', $resultadoLogin[$i]['usuarios']['LOGIN'] );
						//$this->Session->write( 'Usuario.email', $resultadoLogin[ $i ][ 'SICA_USU' ][ 'email' ] );
						//$this->Session->write( 'Usuario.cd_area.' . $i, $resultadoLogin[ $i ][ 'AREA_USU' ][ 'cd_area' ] );
						
						$this->Session->write( 'Usuario.logado', true );
						$this->Session->write( 'Usuario.datahora_login', $arrayDataHoraLogin[ 0 ][ 'logs' ][ 'DT_HR_ACESSO' ] );
						
						$this->redirect( array(
							'controller' => 'logs',
							'action' => 'index'
						) );
					}
				} else {
					$this->Session->setFlash( 'Login Falhou. Verifique seus dados de acesso.' );
				}
			}
		}
	
	}

	public function logout()
	{
		$this->Session->destroy();
		$this->Session->setFlash( 'Você saiu do sistema' );
		$this->redirect( array(
			'controller' => 'logins',
			'action' => 'index'
		) );
	}

}

?>